package eu.catengine.common.manager;

import eu.catengine.common.iface.IDisposable;
import android.content.SharedPreferences;

/**
 * Manager odpowiedzialny za przechowywanie dodatkowych danych.
 * 
 * @author mbienkowski
 */
public class DataManager implements IDisposable
{
    private static volatile DataManager mInstance;
    private SharedPreferences mPreferences;
    private SharedPreferences.Editor mEditor;

    private DataManager()
    {
    }

    /**
     * Zwraca instanację managera.
     */
    public static DataManager getInstance()
    {
	if (mInstance == null)
	{
	    mInstance = new DataManager();
	}
	return mInstance;
    }

    /**
     * Ustawia obiekt dodatkowych opcji dla managera.<br>
     * Metoda wywoływana automatycznie.
     */
    public void setSharedPreferences(SharedPreferences pref)
    {
	this.mPreferences = pref;
	this.mEditor = pref.edit();
    }

    /**
     * Zapamiętuje wartość True/False.
     * 
     * @param key
     *            <code>String</code> Klucz zmiennej.
     * @param value
     *            <code>boolean</code> Wartość zmiennej.
     */
    public void setBoolean(String key, boolean value)
    {
	mEditor.putBoolean(key, value);
	mEditor.commit();
    }

    /**
     * Zapamiętuje wartość liczbową zmiennoprzecinkową.
     * 
     * @param key
     *            <code>String</code> Klucz zmiennej.
     * @param value
     *            <code>float</code> Wartość zmiennej.
     */
    public void setFloat(String key, float value)
    {
	mEditor.putFloat(key, value);
	mEditor.commit();
    }

    /**
     * Zapamiętuje wartość liczbową całkowitą.
     * 
     * @param key
     *            <code>String</code> Klucz zmiennej.
     * @param value
     *            <code>int</code> Wartość zmiennej.
     */
    public void setInt(String key, int value)
    {
	mEditor.putInt(key, value);
	mEditor.commit();
    }

    /**
     * Zapamiętuje wartość dużą liczbę całkowitą.
     * 
     * @param key
     *            <code>String</code> Klucz zmiennej.
     * @param value
     *            <code>long</code> Wartość zmiennej.
     */
    public void setLong(String key, long value)
    {
	mEditor.putLong(key, value);
	mEditor.commit();
    }

    /**
     * Zapamiętuje wartość tekstową.
     * 
     * @param key
     *            <code>String</code> Klucz zmiennej.
     * @param value
     *            <code>String</code> Wartość zmiennej.
     */
    public void setString(String key, String value)
    {
	mEditor.putString(key, value);
	mEditor.commit();
    }

    /**
     * Zwraca wartość zmiennej.
     * 
     * @param key
     *            <code>String<c/ode> Klucz zmiennej.
     * @param defaultValue
     *            <code>boolean</code> Wartość domyślna w przypadku, gdyby
     *            zmienna nie istniała.
     * @return <code>boolean</code> Zapamiętana zmienna lub wartość domyślna.
     */
    public boolean getBoolean(String key, boolean defaultValue)
    {
	return mPreferences.getBoolean(key, defaultValue);
    }

    /**
     * Zwraca wartość zmiennej.
     * 
     * @param key
     *            <code>String</code> Klucz zmiennej.
     * @param defaultValue
     *            <code>float</code> Wartość domyślna w przypadku, gdyby zmienna
     *            nie istniała.
     * @return <code>float</code> Zapamiętana zmienna lub wartość domyślna.
     */
    public float getFloat(String key, float defaultValue)
    {
	return mPreferences.getFloat(key, defaultValue);
    }

    /**
     * Zwraca wartość zmiennej.
     * 
     * @param key
     *            <code>String</code> Klucz zmiennej.
     * @param defaultValue
     *            <code>int</code> Wartość domyślna w przypadku, gdyby zmienna
     *            nie istniała.
     * @return <code>int</code> Zapamiętana zmienna lub wartość domyślna.
     */
    public int getInt(String key, int defaultValue)
    {
	return mPreferences.getInt(key, defaultValue);
    }

    /**
     * Zwraca wartość zmiennej.
     * 
     * @param key
     *            <code>String</code> Klucz zmiennej.
     * @param defaultValue
     *            <code>long</code> Wartość domyślna w przypadku, gdyby zmienna
     *            nie istniała.
     * @return <code>long</code> Zapamiętana zmienna lub wartość domyślna.
     */
    public long getLong(String key, long defaultValue)
    {
	return mPreferences.getLong(key, defaultValue);
    }

    /**
     * Zwraca wartość zmiennej.
     * 
     * @param key
     *            <code>String</code> Klucz zmiennej.
     * @param defaultValue
     *            <code>String</code> Wartość domyślna w przypadku, gdyby
     *            zmienna nie istniała.
     * @return <code>String</code> Zapamiętana zmienna lub wartość domyślna.
     */
    public String getString(String key, String defaultValue)
    {
	return mPreferences.getString(key, defaultValue);
    }

    @Override
    public void dispose()
    {
	mInstance = null;
	mPreferences = null;
	mEditor = null;
    }
}
